/*
 [JspRun!] (C)2007-2011 JspRun Inc.
 This is NOT a freeware, use is subject to license terms
 $RCSfile: menu.js,v $
 $Revision: 1.7 $
 $Date: 2011/01/04 11:19:26 $
 */
var jsmenu = [];
var ctrlobjclassName;
jsmenu.active = [];
jsmenu.timer = [];
jsmenu.iframe = [];

function initCtrl(ctrlobj, click, duration, timeout, layer){
    if (ctrlobj && !ctrlobj.initialized) {
        ctrlobj.initialized = true;
        ctrlobj.unselectable = true;
        
        ctrlobj.outfunc = typeof ctrlobj.onmouseout == 'function' ? ctrlobj.onmouseout : null;
        ctrlobj.onmouseout = function(){
            if (this.outfunc) {
                this.outfunc();
            }
            if (duration < 3) {
                jsmenu.timer[ctrlobj.id] = setTimeout('hideMenu(' + layer + ')', timeout);
            }
        };
        if (click && duration) {
            ctrlobj.clickfunc = typeof ctrlobj.onclick == 'function' ? ctrlobj.onclick : null;
            ctrlobj.onclick = function(e){
                doane(e);
                if (jsmenu.active[layer] == null || jsmenu.active[layer].ctrlkey != this.id) {
                    if (this.clickfunc) {
                        this.clickfunc();
                    }
                    else {
                        showMenu(this.id, true);
                    }
                }
                else {
                    hideMenu(layer);
                }
            };
        }
        
        ctrlobj.overfunc = typeof ctrlobj.onmouseover == 'function' ? ctrlobj.onmouseover : null;
        ctrlobj.onmouseover = function(e){
            doane(e);
            if (this.overfunc) {
                this.overfunc();
            }
            if (click) {
                clearTimeout(jsmenu.timer[this.id]);
            }
            else {
                for (var id in jsmenu.timer) {
                    if (jsmenu.timer[id]) {
                        clearTimeout(jsmenu.timer[id]);
                    }
                }
            }
        };
    }
}

function initMenu(ctrlid, menuobj, duration, timeout, layer){
    if (menuobj && !menuobj.initialized) {
        menuobj.initialized = true;
        menuobj.ctrlkey = ctrlid;
        menuobj.onclick = ebygum;
        menuobj.style.position = 'absolute';
        if (duration < 3) {
            if (duration > 1) {
                menuobj.onmouseover = function(){
                    clearTimeout(jsmenu.timer[ctrlid]);
                };
            }
            if (duration != 1) {
                menuobj.onmouseout = function(){
                    jsmenu.timer[ctrlid] = setTimeout('hideMenu(' + layer + ')', timeout);
                };
            }
        }
        menuobj.style.zIndex = 50;
    }
}

function showMenu(ctrlid, click, offset, duration, timeout, layer, showid, maxh){
    e = window.event || showMenu.caller["arguments"][0];
    var ctrlobj = $(ctrlid);
    if (!ctrlobj) {
        return;
    }
    if (isUndefined(click)) {
        click = false;
    }
    if (isUndefined(offset)) {
        offset = 0;
    }
    if (isUndefined(duration)) {
        duration = 2;
    }
    if (isUndefined(timeout)) {
        timeout = 500;
    }
    if (isUndefined(layer)) {
        layer = 0;
    }
    if (isUndefined(showid)) {
        showid = ctrlid;
    }
    var showobj = $(showid);
    var menuobj = $(showid + '_menu');
    if (!showobj || !menuobj) {
        return;
    }
    if (isUndefined(maxh)) {
        maxh = 400;
    }
    hideMenu(layer);
    for (var id in jsmenu.timer) {
        if (jsmenu.timer[id]) {
            clearTimeout(jsmenu.timer[id]);
        }
    }
    initCtrl(ctrlobj, click, duration, timeout, layer);
    ctrlobjclassName = ctrlobj.className;
    ctrlobj.className += ' hover';
    initMenu(ctrlid, menuobj, duration, timeout, layer);
    
    menuobj.style.display = '';
    if (!is_opera) {
        menuobj.style.clip = 'rect(auto, auto, auto, auto)';
    }
    
    setMenuPosition(showid, offset);
    
    if (is_ie && is_ie < 7) {
        if (!jsmenu.iframe[layer]) {
            var iframe = document.createElement('iframe');
            iframe.style.display = 'none';
            iframe.style.position = 'absolute';
            iframe.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';
            if ($('append_parent')) {
                $('append_parent').appendChild(iframe);
            }
            else {
                menuobj.parentNode.appendChild(iframe);
            }
            jsmenu.iframe[layer] = iframe;
        }
        jsmenu.iframe[layer].style.top = menuobj.style.top;
        jsmenu.iframe[layer].style.left = menuobj.style.left;
        jsmenu.iframe[layer].style.width = menuobj.w;
        jsmenu.iframe[layer].style.height = menuobj.h;
        jsmenu.iframe[layer].style.display = 'block';
    }
    
    if (maxh && menuobj.scrollHeight > maxh) {
        menuobj.style.height = maxh + 'px';
        if (is_opera) {
            menuobj.style.overflow = 'auto';
        }
        else {
            menuobj.style.overflowY = 'auto';
        }
    }
    
    if (!duration) {
        setTimeout('hideMenu(' + layer + ')', timeout);
    }
    
    jsmenu.active[layer] = menuobj;
}

function setMenuPosition(showid, offset){
    var showobj = $(showid);
    var menuobj = $(showid + '_menu');
    if (isUndefined(offset)) {
        offset = 0;
    }
    if (showobj) {
        showobj.pos = fetchOffset(showobj);
        showobj.X = showobj.pos.left;
        showobj.Y = showobj.pos.top;
        showobj.w = showobj.offsetWidth;
        showobj.h = showobj.offsetHeight;
        menuobj.w = menuobj.offsetWidth;
        menuobj.h = menuobj.offsetHeight;
        menuobj.style.left = (showobj.X + menuobj.w > document.body.clientWidth) && (showobj.X + showobj.w - menuobj.w >= 0) ? showobj.X + showobj.w - menuobj.w + 'px' : showobj.X + 'px';
        menuobj.style.top = offset == 1 ? showobj.Y + 'px' : (offset == 2 || ((showobj.Y + showobj.h + menuobj.h > document.documentElement.scrollTop + document.documentElement.clientHeight) && (showobj.Y - menuobj.h >= 0)) ? (showobj.Y - menuobj.h) + 'px' : showobj.Y + showobj.h + 'px');
        if (menuobj.style.clip && !is_opera) {
            menuobj.style.clip = 'rect(auto, auto, auto, auto)';
        }
    }
}

function hideMenu(layer){
    if (isUndefined(layer)) {
        layer = 0;
    }
    if (jsmenu.active[layer]) {
        try {
            $(jsmenu.active[layer].ctrlkey).className = ctrlobjclassName;
        } 
        catch (e) {
        }
        clearTimeout(jsmenu.timer[jsmenu.active[layer].ctrlkey]);
        jsmenu.active[layer].style.display = 'none';
        if (is_ie && is_ie < 7 && jsmenu.iframe[layer]) {
            jsmenu.iframe[layer].style.display = 'none';
        }
        jsmenu.active[layer] = null;
    }
}

function fetchOffset(obj){
    var left_offset = obj.offsetLeft;
    var top_offset = obj.offsetTop;
    while ((obj = obj.offsetParent) != null) {
        left_offset += obj.offsetLeft;
        top_offset += obj.offsetTop;
    }
    return {
        'left': left_offset,
        'top': top_offset
    };
}

function ebygum(eventobj){
    if (!eventobj || is_ie) {
        window.event.cancelBubble = true;
        return window.event;
    }
    else {
        if (eventobj.target.type == 'submit') {
            eventobj.target.form.submit();
        }
        eventobj.stopPropagation();
        return eventobj;
    }
}

function menuoption_onclick_function(e){
    this.clickfunc();
    hideMenu();
}

function menuoption_onclick_link(e){
    choose(e, this);
}

function menuoption_onmouseover(e){
    this.className = 'popupmenu_highlight';
}

function menuoption_onmouseout(e){
    this.className = 'popupmenu_option';
}

function choose(e, obj){
    var links = obj.getElementsByTagName('a');
    if (links[0]) {
        if (is_ie) {
            links[0].click();
            window.event.cancelBubble = true;
        }
        else {
            if (e.shiftKey) {
                window.open(links[0].href);
                e.stopPropagation();
                e.preventDefault();
            }
            else {
                window.location = links[0].href;
                e.stopPropagation();
                e.preventDefault();
            }
        }
        hideMenu();
    }
}
